package com.wanli.service.impl;
import com.wanli.domain.entity.Menu;
import com.wanli.domain.entity.User;
import com.wanli.domain.dto.MenuDto;
import com.wanli.mapper.MenuMapper;
import com.wanli.mapper.UserMapper;
import com.wanli.service.MenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wanli.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  菜单业务逻辑层
 * </p>
 *
 * @author Byterain
 * @since 2023-12-06
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
    @Autowired
    UserService userService;
    @Autowired
    UserMapper userMapper;
    @Override
    public List<MenuDto> getCurrentUserNav(String username) {
        //根据用户名username查询该用户的对象信息
        User user = userService.getUserByUsername(username);
        //根据userId查询当前用户所能操作的所有菜单id。
        List<Long> menuIds = userMapper.getNavMenuIds(user.getId());

        //根据菜单id查询出所有的菜单数据：IService中的方法listByIds()
        List<Menu> menus = this.listByIds(menuIds);

        //调用buildTreeMenu方法将菜单层级数据返回
        List<Menu> finalMenu = buildTreeMenu(menus);
        //将finalMenu转换为MenuDto实体类对象。
        return convert(finalMenu);
    }

    @Override
    public List<Menu> tree() {
        List<Menu> menus = this.list();
        List<Menu> treeMenu = this.buildTreeMenu(menus);
        return treeMenu;
    }

    //将集合中Menu对象转化为MenuDto对象
    private List<MenuDto> convert(List<Menu> menus){
        List<MenuDto> menuDtoList = new ArrayList<>();
        menus.forEach(m ->{
            MenuDto dto = new MenuDto();
            dto.setId(m.getId());
            dto.setName(m.getPerms());   //dto.name --- 菜单menu.perms权限字段
            dto.setTitle(m.getName());   //dto.titile --- 菜单menu.name字段 菜单名称
            dto.setIcon(m.getIcon());
            dto.setPath(m.getPath());
            dto.setComponent(m.getComponent());
            if(m.getChildren().size() > 0){
                //存入dto子菜单对象也必须是MenuDto类型，使用递归调用方法本身，将子菜单集合传入 递归执行进行转换
                dto.setChildren( convert(m.getChildren()) );
            }
            menuDtoList.add(dto);
        });
        return menuDtoList;
    }

    //将查询出的菜单数据 变为具有层级关系的 菜单数据TreeMenu
    private List<Menu> buildTreeMenu(List<Menu> menus){
        //最终菜单，已经通过循环遍历查找所有层级关系后菜单数据
        List<Menu> finalMenu = new ArrayList<>();

        for(Menu m : menus){
            //寻找子菜单
            for(Menu e : menus){
                if(e.getParentId() == m.getId()){
                    //当前循环的e就是m子菜单
                    m.getChildren().add(e);  //将e菜单加入到m的子菜单集合中
                }
            }
            if(m.getParentId() == 0L){
                finalMenu.add(m);  //m如果父菜单id是0，说明就是一级菜单，加入到最终菜单集合中。
            }
        }
        return finalMenu;
    }
}
